Enum Mapping

Java Technologies - ম্যাপস্ট্রাক্ট (MapStruct)
95
95

MapStruct একটি জাভা মডেল মেপিং টুল যা ডোমেইন অবজেক্ট এবং DTO (Data Transfer Object) এর মধ্যে ডেটা ম্যাপিং করতে সাহায্য করে। Enum Mapping হল একটি সাধারণ বৈশিষ্ট্য যা ম্যাপস্ট্রাক্টের মাধ্যমে Enum types এর মধ্যে ম্যাপিং করে। Enum Mapping এর মাধ্যমে আপনি একটি Enum টাইপ থেকে অন্য Enum টাইপে বা একটি Enum থেকে String, Integer ইত্যাদিতে ডেটা ট্রান্সফার করতে পারেন।

এই টিউটোরিয়ালে আমরা MapStruct ব্যবহার করে Enum Mapping এর ধারণা এবং উদাহরণ সহ দেখব।


১. Enum Mapping এর ধারণা

Enum Mapping হল এমন একটি প্রক্রিয়া যেখানে একটি Enum টাইপকে অন্য একটি Enum টাইপে বা অন্য কোনো ডেটা টাইপে (যেমন String বা Integer) ম্যাপ করা হয়। মেভেনের মাধ্যমে একাধিক Enum types এর মধ্যে ম্যাপিং করা সহজ এবং টাইপ সেফ হয়।

MapStruct একটি খুবই শক্তিশালী টুল যা Enum Mapping সম্পন্ন করতে ব্যবহার করা যেতে পারে। এতে আপনি সহজেই Enum থেকে Enum বা Enum থেকে String বা Integer এর মধ্যে ম্যাপিং করতে পারেন।


২. Enum Mapping উদাহরণ

ধরা যাক আমাদের দুটি Enum রয়েছে: Department এবং DepartmentDTO, যেখানে আমরা একটি Enum টাইপের ভ্যালু অন্য Enum টাইপে ম্যাপ করতে চাই।

২.১ Department Enum:

public enum Department {
    IT,
    HR,
    FINANCE,
    MARKETING;
}

২.২ DepartmentDTO Enum:

public enum DepartmentDTO {
    IT_DEPARTMENT,
    HUMAN_RESOURCES,
    FINANCE_DEPARTMENT,
    MARKETING_DEPARTMENT;
}

২.৩ DepartmentMapper Interface (MapStruct Mapper):

MapStruct এর মাধ্যমে আমরা Department Enum কে DepartmentDTO Enum এ ম্যাপ করতে চাই। নিচে এর জন্য Mapper Interface দেওয়া হয়েছে:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface DepartmentMapper {

    DepartmentMapper INSTANCE = Mappers.getMapper(DepartmentMapper.class);

    @Mapping(source = "department", target = "departmentDTO")
    DepartmentDTO departmentToDepartmentDTO(Department department);
}

এখানে:

  • @Mapping অ্যানোটেশন ব্যবহার করা হয়েছে, যেখানে source এবং target নির্ধারণ করা হয়েছে।
  • departmentToDepartmentDTO মেথডটি Department Enum কে DepartmentDTO Enum এ ম্যাপ করবে।

৩. Enum Mapping String বা Integer এ

আপনি যখন Enum থেকে String বা Integer এ ম্যাপিং করতে চান, তখন আপনি MapStruct এর @ValueMapping অ্যানোটেশন ব্যবহার করতে পারেন।

৩.১ Department Enum থেকে String Mapping:

ধরা যাক, আমরা Department Enum এর ভ্যালুগুলি String এ ম্যাপ করতে চাই।

@Mapper
public interface DepartmentMapper {

    DepartmentMapper INSTANCE = Mappers.getMapper(DepartmentMapper.class);

    @Mapping(source = "department", target = "departmentName")
    String departmentToString(Department department);
}

এখানে, departmentToString মেথডটি Department Enum এর মানকে String এ কনভার্ট করবে।

৩.২ Department Enum থেকে Integer Mapping:

যদি আপনি Department Enum কে Integer এ ম্যাপ করতে চান (যেমন Enum এর একটি নির্দিষ্ট মানের জন্য Integer ভ্যালু ফেরত দিতে), তাহলে এটি এভাবে করা যেতে পারে:

@Mapper
public interface DepartmentMapper {

    DepartmentMapper INSTANCE = Mappers.getMapper(DepartmentMapper.class);

    @Mapping(target = "departmentCode", expression = "java(department.ordinal())")
    Integer departmentToInteger(Department department);
}

এখানে, ordinal() মেথড ব্যবহার করে Enum এর মানের অবস্থানকে Integer ভ্যালু হিসেবে ব্যবহার করা হয়েছে। উদাহরণস্বরূপ, IT Enum এর অবস্থান হবে 0, HR এর অবস্থান হবে 1 ইত্যাদি।


৪. Custom Enum Mapping

কিছু ক্ষেত্রে, আপনি কাস্টম ম্যাপিং যুক্ত করতে পারেন যেখানে Enum এর এক ধরনের মানকে অন্য ধরনের মানে ম্যাপ করতে হয়, যেমন Enum এর নাম পরিবর্তন বা কোনো অতিরিক্ত লজিক প্রয়োগ করা।

৪.১ Custom Enum Mapping Example:

@Mapper
public interface DepartmentMapper {

    DepartmentMapper INSTANCE = Mappers.getMapper(DepartmentMapper.class);

    @Mapping(target = "departmentDTO", expression = "java(mapDepartment(department))")
    DepartmentDTO departmentToDepartmentDTO(Department department);

    default DepartmentDTO mapDepartment(Department department) {
        switch (department) {
            case IT: return DepartmentDTO.IT_DEPARTMENT;
            case HR: return DepartmentDTO.HUMAN_RESOURCES;
            case FINANCE: return DepartmentDTO.FINANCE_DEPARTMENT;
            case MARKETING: return DepartmentDTO.MARKETING_DEPARTMENT;
            default: throw new IllegalArgumentException("Unknown department: " + department);
        }
    }
}

এখানে, mapDepartment মেথডে Department Enum এর মানকে কাস্টমভাবে DepartmentDTO Enum এ ম্যাপ করা হয়েছে।


৫. Enum Mapping Best Practices

  1. Use of @Mapping Annotation: Enum Mapping করার সময়, @Mapping অ্যানোটেশন ব্যবহার করে সঠিকভাবে সোর্স এবং টার্গেট নির্ধারণ করুন।
  2. Ordinal Mapping: যদি আপনি Enum এর অবস্থান (ordinal value) ব্যবহার করতে চান, তবে ordinal() ব্যবহার করুন, কিন্তু এটির মানের পরিবর্তনকে নজরে রাখুন।
  3. Custom Logic: কাস্টম ম্যাপিং করার সময়, default methods এবং expression ব্যবহার করুন।
  4. Exception Handling: Enum Mapping এর ক্ষেত্রে কোনো অজানা মান আসলে IllegalArgumentException বা অন্য কোন কাস্টম এক্সসেপশন থ্রো করতে পারেন।

সারাংশ

MapStruct এর মাধ্যমে Enum Mapping খুবই সহজ এবং টাইপ সেফ। আপনি Enum থেকে Enum, Enum থেকে String, বা Enum থেকে Integer বা কাস্টম টাইপে ম্যাপিং করতে পারবেন। MapStruct compile-time এ কোড জেনারেট করে, তাই এটি দ্রুত এবং পারফরম্যান্সে উপযোগী। কাস্টম ম্যাপিংয়ের জন্য আপনি default methods এবং expressions ব্যবহার করতে পারেন, যা একাধিক Enum মানের মধ্যে সুনির্দিষ্ট লজিক প্রয়োগে সাহায্য করে।


Content added By

Enum কি এবং এর ব্যবহার

85
85

Enum (Enumeration) একটি বিশেষ ধরনের ডেটা টাইপ যা নির্দিষ্ট সংখ্যক কনস্ট্যান্ট ভ্যালু ধারণ করে। Java তে Enum একটি ক্লাসের মতো কাজ করে তবে এটি কেবল একটি পূর্বনির্ধারিত সীমিত সেটের ভ্যালু ধারণ করে। Enum সাধারণত ফ্ল্যাগ, স্টেট, কন্ডিশন বা ডোমেইন টাইপ প্রতিনিধিত্ব করার জন্য ব্যবহৃত হয়।

MapStruct Enum ম্যাপিংয়ের জন্য একটি শক্তিশালী সমাধান প্রদান করে। MapStruct ব্যবহার করে, আপনি সহজেই একটি Enum টাইপকে অন্য Enum টাইপে বা String, Integer ইত্যাদি ভ্যালুতে ম্যাপ করতে পারেন।

এখানে Enum Mapping এর ব্যবহার এবং উদাহরণ আলোচনা করা হবে।


১. Enum কি এবং এর ব্যবহার

Enum হল একটি ডাটা টাইপ যা নির্দিষ্ট সংখ্যক নামকরা কনস্ট্যান্ট ভ্যালু ধারণ করে। Java তে Enum ক্লাসগুলি একটি নির্দিষ্ট অবস্থার মধ্যে থাকা কনস্ট্যান্টের সংগ্রহ হিসেবে ব্যবহৃত হয়। উদাহরণস্বরূপ, Days নামে একটি Enum ক্লাস হতে পারে যা সপ্তাহের সাতটি দিন ধারণ করে: সোমবার, মঙ্গলবার, বুধবার, ইত্যাদি।

Enum এর ব্যবহার:

  1. State Representation: কিছু অবস্থা বা স্টেট রিপ্রেজেন্ট করার জন্য।
  2. Flags: বিভিন্ন ফ্ল্যাগ বা সেটিংস রিপ্রেজেন্ট করতে।
  3. Predefined Values: একটি সীমিত সংখ্যক মান (যেমন, সিজনাল মাস বা ডিরেকশন) প্রতিনিধিত্ব করতে।

Enum উদাহরণ:

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

এখানে, Day নামক Enum সপ্তাহের সাতটি দিন প্রতিনিধিত্ব করছে।


২. MapStruct Enum Mapping

MapStruct ব্যবহার করে Enum এর মানগুলো একটি Enum থেকে অন্য Enum বা অন্য ডেটা টাইপে (যেমন String, Integer) ম্যাপ করা যায়। এটি একটি সাধারণ ম্যাপিং প্রক্রিয়া যেখানে আপনি কাস্টম কনভার্টার তৈরি করতে পারেন বা স্বয়ংক্রিয়ভাবে ম্যাপিং করতে পারেন।

২.১ Basic Enum to Enum Mapping

ধরা যাক, আমাদের দুটি Enum রয়েছে: Day এবং DayDTO। আমরা Day Enum থেকে DayDTO Enum এ ম্যাপিং করতে চাই।

Day.java (Enum)
public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
DayDTO.java (DTO Enum)
public enum DayDTO {
    MON, TUE, WED, THU, FRI, SAT, SUN
}
DayMapper.java (MapStruct Mapper)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface DayMapper {
    DayMapper INSTANCE = Mappers.getMapper(DayMapper.class);

    @Mapping(source = "MONDAY", target = "MON")
    @Mapping(source = "TUESDAY", target = "TUE")
    DayDTO dayToDayDTO(Day day);
}

এখানে, @Mapping অ্যানোটেশন ব্যবহার করে আমরা Day Enum এর প্রতিটি মানকে DayDTO Enum এর সংশ্লিষ্ট মানে ম্যাপ করেছি।

২.২ Enum to String Mapping

এখন, যদি আপনি Enum কে একটি String ভ্যালুতে ম্যাপ করতে চান, তাহলে এটি খুব সহজ। নিচে একটি উদাহরণ দেওয়া হল যেখানে Day Enum থেকে String এ ম্যাপ করা হচ্ছে।

DayMapper.java (Enum to String)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface DayMapper {
    DayMapper INSTANCE = Mappers.getMapper(DayMapper.class);

    @Mapping(source = "MONDAY", target = "Monday")
    @Mapping(source = "TUESDAY", target = "Tuesday")
    String dayToString(Day day);
}

এখানে, Day Enum এর মান String এ ম্যাপ করা হয়েছে, যেখানে MONDAY কে "Monday", TUESDAY কে "Tuesday" তে ম্যাপ করা হচ্ছে।

২.৩ Enum to Integer Mapping

কখনও কখনও Enum মানগুলোকে ইন্টিজার (Integer) টাইপে ম্যাপ করতে হতে পারে। MapStruct এই ধরনের কনভার্সনও সহজেই করতে পারে।

DayMapper.java (Enum to Integer)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface DayMapper {
    DayMapper INSTANCE = Mappers.getMapper(DayMapper.class);

    @Mapping(source = "MONDAY", target = "1")
    @Mapping(source = "TUESDAY", target = "2")
    int dayToInteger(Day day);
}

এখানে, Day Enum এর মানগুলিকে সংশ্লিষ্ট Integer ভ্যালুতে ম্যাপ করা হয়েছে (যেমন, MONDAY কে 1, TUESDAY কে 2).


৩. Custom Mapping for Enum Types

আপনি যদি আরো কাস্টম কনভার্সন বা ম্যাপিং চান, তবে MapStruct এর মাধ্যমে কাস্টম ম্যাপিং ফাংশনও তৈরি করতে পারেন। উদাহরণস্বরূপ, যদি Enum এর মধ্যে কোনো কাস্টম লজিক প্রয়োগ করতে হয়, যেমন কিছু কন্ডিশনাল ম্যাপিং, তবে আপনি কাস্টম কনভার্টার তৈরি করতে পারেন।

উদাহরণ: Custom Enum Mapping

ধরা যাক, আপনার Enum ক্লাসে কিছু কাস্টম লজিক প্রয়োগ করতে হবে, যেমন Day Enum এর জন্য, "Weekend" এবং "Weekday" এর মধ্যে ভাগ করা।

DayMapper.java (Custom Mapping)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
import org.mapstruct.factory.Mappers;

@Mapper
public interface DayMapper {
    DayMapper INSTANCE = Mappers.getMapper(DayMapper.class);

    @Mapping(source = "day", target = "type", qualifiedByName = "dayToType")
    DayDTO dayToDayDTO(Day day);

    @Named("dayToType")
    default String dayToType(Day day) {
        if (day == Day.SATURDAY || day == Day.SUNDAY) {
            return "Weekend";
        }
        return "Weekday";
    }
}

এখানে, আমরা Custom Mapping ফাংশন dayToType তৈরি করেছি, যা Day Enum কে "Weekend" বা "Weekday" তে কনভার্ট করবে।


৪. MapStruct Enum Mapping এর সুবিধা

  1. Automated Code Generation: MapStruct কোড জেনারেট করে, ফলে আপনাকে ম্যানুয়ালি ম্যাপিং কোড লিখতে হয় না।
  2. Compile-time Mapping: এটি compile-time এ ম্যাপিং কোড তৈরি করে, ফলে রuntime পারফরম্যান্সের ওপর কোনো নেতিবাচক প্রভাব পড়ে না।
  3. No Reflection: MapStruct রিফ্লেকশন ব্যবহার করে না, ফলে এটি দ্রুত এবং পারফরম্যান্সের জন্য কার্যকর।
  4. Custom Mappings: কাস্টম কনভার্টার এবং কাস্টম ম্যাপিং ফাংশন তৈরি করার সুবিধা।

৫. সারাংশ

MapStruct একটি শক্তিশালী টুল যা Java প্রোজেক্টে Enum Mapping সহজ করে তোলে। আপনি Enum টাইপ থেকে String, Integer বা অন্য কোনো টাইপে ম্যাপিং করতে পারেন এবং প্রয়োজনে কাস্টম ম্যাপিং ফাংশনও তৈরি করতে পারেন। MapStruct এর মাধ্যমে Enum ম্যাপিং প্রক্রিয়াটি দ্রুত, সঠিক এবং পারফরম্যান্সে উপকারী হয়, কারণ এটি compile-time কোড জেনারেশন ব্যবহার করে এবং Reflection এর প্রয়োজন পড়ে না।


Content added By

MapStruct এর মাধ্যমে Enum Mapping করা

85
85

MapStruct হল একটি powerful framework যা Java প্রোজেক্টে Object Mapping সহজ করে তোলে। যখন আপনার ডোমেইন অবজেক্টগুলির মধ্যে enum values ট্রান্সফার করার প্রয়োজন হয়, তখন MapStruct আপনাকে সহজ এবং কার্যকরী উপায়ে Enum Mapping সম্পন্ন করতে সহায়তা করে।

Enum Mapping হল এমন একটি প্রক্রিয়া যেখানে এক ধরনের enum কে অন্য ধরনের enum এ ম্যাপ করা হয়। উদাহরণস্বরূপ, আপনি যদি একটি enum-এ থাকা মানগুলিকে অন্য একটি enum-এ ম্যাপ করতে চান, তবে MapStruct এই কাজটি অটোমেটিকভাবে করে দিতে পারে।

এখানে আমরা MapStruct এর মাধ্যমে Enum Mapping করার একটি উদাহরণ দেখব।


১. Enum Mapping এর প্রয়োজনীয়তা

যখন আপনার প্রোজেক্টে বিভিন্ন ধরনের enum (যেমন, Status, Gender, Type ইত্যাদি) থাকে এবং আপনি এগুলোর মধ্যে ডেটা ট্রান্সফার করতে চান, তখন Enum Mapping গুরুত্বপূর্ণ। MapStruct এর মাধ্যমে আপনি সহজেই এক enum থেকে অন্য enum এ মান স্থানান্তর করতে পারবেন, যা কোডের পরিস্কারতা ও কার্যকারিতা উন্নত করে।


২. Enum Mapping উদাহরণ

ধরা যাক, আপনার দুটি enum রয়েছে, একটি GenderEnum এবং একটি GenderDTO

GenderEnum.java

public enum GenderEnum {
    MALE,
    FEMALE,
    OTHER
}

GenderDTO.java

public enum GenderDTO {
    M,
    F,
    O
}

এখানে, GenderEnum এর মানগুলিকে GenderDTO তে ম্যাপ করতে হবে। মানে, MALE হবে M, FEMALE হবে F, এবং OTHER হবে O

GenderMapper.java (MapStruct Mapper)

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface GenderMapper {
    GenderMapper INSTANCE = Mappers.getMapper(GenderMapper.class);

    // Mapping GenderEnum to GenderDTO
    @Mapping(source = "MALE", target = "M")
    @Mapping(source = "FEMALE", target = "F")
    @Mapping(source = "OTHER", target = "O")
    GenderDTO genderEnumToGenderDTO(GenderEnum genderEnum);
}

এখানে, @Mapping অ্যানোটেশন ব্যবহার করে GenderEnum এর মানগুলো GenderDTO এর মানে ম্যাপ করা হয়েছে।

Main.java (Test Example)

public class Main {
    public static void main(String[] args) {
        GenderEnum genderEnum = GenderEnum.MALE;

        // Map GenderEnum to GenderDTO
        GenderDTO genderDTO = GenderMapper.INSTANCE.genderEnumToGenderDTO(genderEnum);

        System.out.println("Mapped GenderDTO: " + genderDTO);
    }
}

এখানে, MapStruct এর মাধ্যমে GenderEnum এর মান GenderDTO এ ম্যাপ করা হয়েছে। MALE মানটি M তে, FEMALE মানটি F তে এবং OTHER মানটি O তে ম্যাপ হবে।


৩. Custom Mapping for Enums (কাস্টম Enum Mapping)

কখনও কখনও, আপনার enum এর মধ্যে কিছু কাস্টম কনভার্সন লজিক প্রয়োজন হতে পারে। MapStruct আপনাকে custom mapping methods তৈরি করতে সহায়তা করে।

উদাহরণ: কাস্টম Enum Mapping

public enum StatusEnum {
    ACTIVE,
    INACTIVE,
    PENDING
}

public enum StatusDTO {
    A,    // Active
    I,    // Inactive
    P     // Pending
}

এখানে, আপনি StatusEnum এর মানগুলো StatusDTO এ কাস্টম ম্যাপ করতে চান।

StatusMapper.java (MapStruct Mapper)

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface StatusMapper {
    StatusMapper INSTANCE = Mappers.getMapper(StatusMapper.class);

    @Mapping(source = "ACTIVE", target = "A")
    @Mapping(source = "INACTIVE", target = "I")
    @Mapping(source = "PENDING", target = "P")
    StatusDTO statusEnumToStatusDTO(StatusEnum statusEnum);
}

এখানে, কাস্টম ম্যাপিংয়ের মাধ্যমে StatusEnum থেকে StatusDTO এ মান ট্রান্সফার করা হচ্ছে। ACTIVEA, INACTIVEI, এবং PENDINGP


৪. MapStruct Enum Mapping এর সুবিধা

  1. Type Safety: MapStruct প্রকার সুরক্ষা নিশ্চিত করে, তাই টাইপ সংক্রান্ত কোনো ভুল হওয়ার সম্ভাবনা কমে যায়।
  2. Compile-time Validation: MapStruct compile-time এ কোড জেনারেট করে, ফলে ডেভেলপমেন্টের সময় কোনো ত্রুটি দেখা দিলে তা আগেই ধরা পড়ে।
  3. No Reflection: MapStruct reflection ব্যবহার করে না, যা পারফরম্যান্সে সুবিধা দেয়।
  4. Easy Integration: MapStruct খুব সহজেই Spring, Quarkus, JPA ইত্যাদি ফ্রেমওয়ার্কের সাথে ইন্টিগ্রেট করা যায়।

৫. Enum Mapping in Collection

আপনি যদি enum ম্যাপিং করতে চান এবং এটি collections (List, Set) বা arrays এর মধ্যে প্রয়োগ করতে চান, তবে MapStruct এই ধরনের ম্যাপিং সমর্থন করে। এটি আপনাকে সহজেই List থেকে List এ ম্যাপিং করতে সাহায্য করে।

Collection Mapping Example

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<GenderEnum> genderList = List.of(GenderEnum.MALE, GenderEnum.FEMALE, GenderEnum.OTHER);

        // Map List of GenderEnum to List of GenderDTO
        List<GenderDTO> genderDTOList = GenderMapper.INSTANCE.genderEnumListToGenderDTOList(genderList);

        genderDTOList.forEach(gender -> System.out.println("Mapped GenderDTO: " + gender));
    }
}

এখানে, List কে List এ ম্যাপ করা হয়েছে।


৬. সারাংশ

MapStruct এর মাধ্যমে Enum Mapping অত্যন্ত সহজ এবং কার্যকর। এটি ডোমেইন অবজেক্ট এবং DTO এর মধ্যে enum values ট্রান্সফার করতে সহায়তা করে, এবং কাস্টম ম্যাপিং বা কনভার্সন লজিক প্রয়োগ করা সম্ভব হয়। MapStruct আপনাকে compile-time কোড জেনারেশন, টাইপ সেফটি, এবং no reflection সুবিধা প্রদান করে, যা পারফরম্যান্স এবং ডেভেলপমেন্টে অনেক সুবিধা দেয়। এর মাধ্যমে আপনি enum গুলির মধ্যে ম্যাপিং খুব সহজে এবং দক্ষতার সাথে করতে পারবেন।


Content added By

String থেকে Enum এবং Enum থেকে String Mapping এর উদাহরণ

98
98

MapStruct একটি শক্তিশালী টুল যা JavaBeans এবং DTO (Data Transfer Objects) এর মধ্যে ম্যাপিং কাজ সম্পন্ন করে। Enum Mapping MapStruct এর মাধ্যমে খুবই সহজ এবং কার্যকরীভাবে করা যেতে পারে। Enum হল একটি ডাটা টাইপ যা সীমিত সংখ্যক কনস্ট্যান্ট ভ্যালু ধারণ করে। কখনও কখনও, আমাদের প্রয়োজন হয় একটি String কে Enum এ এবং আবার একটি Enum কে String এ ম্যাপ করার, যা MapStruct সহজে সমাধান করে।

এখানে, আমরা দেখব কিভাবে String থেকে Enum এবং Enum থেকে String ম্যাপিং করা যায় MapStruct এর মাধ্যমে।


১. Enum Mapping এর প্রয়োজনীয়তা

Enum ম্যাপিং তখন প্রয়োজন হয় যখন আপনি একটি String ভ্যালুকে একটি Enum ভ্যালুতে কনভার্ট করতে চান বা বিপরীতটি করতে চান, উদাহরণস্বরূপ:

  • String ("ACTIVE", "INACTIVE") কে Enum এর মানে পরিণত করা।
  • Enum (এমনকি সিস্টেমে কোন কনস্ট্যান্ট) কে String রূপে প্রেরণ বা স্টোর করা।

এটি সাধারণত DTOs এবং Entity Models এর মধ্যে ডেটা এক্সচেঞ্জে ব্যবহৃত হয়, যেখানে String এবং Enum এর মধ্যে সঠিক রূপান্তর নিশ্চিত করা প্রয়োজন।


২. String থেকে Enum এবং Enum থেকে String Mapping উদাহরণ

ধরা যাক আমাদের একটি Status নামক enum রয়েছে এবং আমরা এটি একটি স্ট্রিং হিসেবে মান গ্রহণ বা ফেরত দিতে চাই।

২.১ Enum Definition (Status)

public enum Status {
    ACTIVE,
    INACTIVE,
    PENDING;
}

এখানে, Status নামক enum তে তিনটি ভ্যালু আছে: ACTIVE, INACTIVE, PENDING

২.২ DTO Class (Destination Object)

public class UserDTO {
    private String name;
    private Status status; // This will be mapped from String or vice versa
    
    // Getters and Setters
}

এখানে, UserDTO ক্লাসে একটি Status enum রয়েছে যা ম্যাপ হবে String থেকে এবং এর বিপরীতে।

২.৩ Mapper Interface (MapStruct Interface)

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

@Mapper
public interface UserMapper {
    
    // String to Enum mapping
    @Mapping(source = "status", target = "status")
    UserDTO userToUserDTO(User user);

    // Enum to String mapping
    @Mapping(source = "status", target = "status")
    User userDTOToUser(UserDTO userDTO);
}

এখানে, MapStruct ব্যবহার করা হয়েছে status ফিল্ডের জন্য String থেকে Enum এবং Enum থেকে String ম্যাপিং করতে। MapStruct স্বয়ংক্রিয়ভাবে ACTIVE, INACTIVE, PENDING এর মতো স্ট্রিংগুলোকে Status enum এ এবং enum মানগুলোকে স্ট্রিং এ ম্যাপ করবে।

২.৪ Model Class (Source Object)

public class User {
    private String name;
    private String status; // This is a String value that will be converted to Enum
    
    // Getters and Setters
}

এখানে, User ক্লাসের status একটি স্ট্রিং হিসাবে সংরক্ষিত হবে, যা Status Enum এর সাথে ম্যাপ হবে।


৩. Mapping Process

এখন, উদাহরণস্বরূপ, নিচের মতো একটি কনভার্সন প্রক্রিয়া চলবে।

৩.১ Main Class (Testing the Mapper)

public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setName("John Doe");
        user.setStatus("ACTIVE");

        UserMapper userMapper = Mappers.getMapper(UserMapper.class);
        
        // String to Enum mapping
        UserDTO userDTO = userMapper.userToUserDTO(user);
        System.out.println("Mapped UserDTO Status (Enum): " + userDTO.getStatus());

        // Enum to String mapping
        User userFromDTO = userMapper.userDTOToUser(userDTO);
        System.out.println("Mapped User Status (String): " + userFromDTO.getStatus());
    }
}

এখানে, MapStruct দুটি ম্যাপিং অপারেশন সম্পন্ন করবে:

  1. String to Enum: user.setStatus("ACTIVE") এর মাধ্যমে ACTIVE স্ট্রিংটি Status.ACTIVE Enum এ ম্যাপ হবে।
  2. Enum to String: userDTO.getStatus() এর মাধ্যমে Enum মানটি ACTIVE স্ট্রিং হিসেবে ফেরত আসবে।

৩.২ Output

Mapped UserDTO Status (Enum): ACTIVE
Mapped User Status (String): ACTIVE

এখানে, প্রথমে String থেকে Enum এবং তারপর Enum থেকে String সফলভাবে ম্যাপ করা হয়েছে।


৪. Custom Enum Mapping (কাস্টম Enum Mapping)

ম্যাপস্ট্রাক্টে String to Enum এবং Enum to String ম্যাপিং কাস্টম লজিক দিয়ে কাস্টমাইজও করা যেতে পারে। উদাহরণস্বরূপ, যদি আপনি একটি String এর মানের উপর ভিত্তি করে Enum ভ্যালু ম্যাপ করতে চান, তাহলে MapStruct এর মাধ্যমে @Mapping অ্যানোটেশনের সাহায্যে কাস্টম ম্যাপিং করা সম্ভব।

৪.১ Custom Mapping Example

@Mapper
public interface UserMapper {
    
    // Custom Mapping from String to Enum with custom logic
    @Mapping(source = "status", target = "status")
    @Mapping(target = "status", expression = "java(mapStatus(user.getStatus()))")
    UserDTO userToUserDTO(User user);

    default Status mapStatus(String status) {
        switch (status.toUpperCase()) {
            case "ACTIVE":
                return Status.ACTIVE;
            case "INACTIVE":
                return Status.INACTIVE;
            default:
                return Status.PENDING; // Default case
        }
    }
}

এখানে, mapStatus মেথডটি কাস্টম ম্যাপিং লজিক সরবরাহ করছে, যা String এর উপর ভিত্তি করে Enum ভ্যালু নির্ধারণ করে।


সারাংশ

MapStruct এর মাধ্যমে String থেকে Enum এবং Enum থেকে String ম্যাপিং খুবই সহজ এবং কার্যকরীভাবে করা যায়। @Mapping অ্যানোটেশন ব্যবহার করে আপনি সাধারণ ম্যাপিং এবং কাস্টম ম্যাপিং উভয়ই করতে পারেন। কাস্টম ম্যাপিংয়ের মাধ্যমে আপনি আপনার ডোমেইন অনুযায়ী লজিক প্রয়োগ করতে পারেন এবং String এর ভিত্তিতে Enum মান নির্ধারণ করতে পারেন।


Content added By

উদাহরণ সহ Enum Mapping

91
91

MapStruct একটি শক্তিশালী টুল যা JavaBeans (POJOs) এর মধ্যে ম্যাপিং সহজ করে এবং এর মাধ্যমে আপনাকে কাস্টম ম্যাপিং, ডেটা কনভার্সন এবং ম্যাপিং এক্সপ্রেশন পরিচালনা করতে সহায়তা করে। Enum Mapping হল MapStruct এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা আপনাকে String থেকে Enum এবং Enum থেকে String এ ম্যাপিং করতে সহায়তা করে।

Enum Mapping এর ধারণা

Enum Mapping তখন প্রয়োজন হয় যখন আপনি String অথবা Integer এর মানকে একটি Enum এ ম্যাপ করতে চান অথবা Enum এর মানকে অন্য কোনো টাইপে (যেমন, String বা Integer) রূপান্তর করতে চান।

MapStruct এর মাধ্যমে Enum Mapping খুবই সহজ, এবং এটি @Mapping অ্যানোটেশন ব্যবহার করে পরিচালিত হয়।


১. Enum Mapping এর উদাহরণ

ধরা যাক, আমাদের একটি Status নামক Enum রয়েছে এবং আমাদের লক্ষ্য হল, String বা Integer মান থেকে এই Enum মানে ম্যাপিং করা।

১.১ Enum Class Definition

public enum Status {
    ACTIVE,
    INACTIVE,
    PENDING;
}

এখানে, আমাদের Status নামক একটি Enum রয়েছে, যা তিনটি মান ধারণ করে: ACTIVE, INACTIVE, এবং PENDING

১.২ DTO (Data Transfer Object)

public class UserDTO {
    private String status;

    // Getter and Setter
}

এখানে, UserDTO ক্লাসে একটি status নামক String প্রপার্টি রয়েছে, যেটি Status Enum এর সাথে ম্যাপ করা হবে।

১.৩ Mapper Interface with Enum Mapping

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    @Mapping(source = "status", target = "status")
    UserDTO userToUserDTO(User user);

    @Mapping(source = "status", target = "status")
    User userDTOToUser(UserDTO userDTO);
}

এখানে, UserMapper ইন্টারফেসে status প্রপার্টি ম্যাপিং করা হচ্ছে, যা String থেকে Enum এবং Enum থেকে String এর মধ্যে কনভার্ট হবে।

১.৪ User Class

public class User {
    private Status status;

    // Getter and Setter
}

এখানে, User ক্লাসে Status নামক Enum টাইপের প্রপার্টি রয়েছে।

১.৫ Main Class (Usage)

public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.setStatus(Status.ACTIVE);

        // Mapping
        UserDTO userDTO = UserMapper.INSTANCE.userToUserDTO(user);
        System.out.println("Mapped Status in DTO: " + userDTO.getStatus());

        // Reversing the mapping
        User userMappedBack = UserMapper.INSTANCE.userDTOToUser(userDTO);
        System.out.println("Mapped Status back in User: " + userMappedBack.getStatus());
    }
}

এখানে, User অবজেক্টের status প্রপার্টি ACTIVE হিসেবে সেট করা হচ্ছে এবং তারপর UserMapper এর মাধ্যমে এটি UserDTO তে ম্যাপ করা হচ্ছে।

২. String থেকে Enum এবং Enum থেকে String Mapping

MapStruct এর মাধ্যমে আপনি String থেকে Enum এবং Enum থেকে String ম্যাপিং করতে পারেন, যখন আপনার প্রয়োজন হয় Enum এর মানকে String হিসেবে রূপান্তর করার অথবা String এর মানকে Enum হিসেবে রূপান্তর করার।

২.১ String থেকে Enum Mapping

@Mapping(source = "status", target = "status")
UserDTO userToUserDTO(User user);

default Status map(String value) {
    return Status.valueOf(value.toUpperCase());
}

এখানে, map() মেথড ব্যবহার করে String কে Enum তে ম্যাপ করা হচ্ছে।

২.২ Enum থেকে String Mapping

@Mapping(source = "status", target = "status")
User userDTOToUser(UserDTO userDTO);

default String map(Status status) {
    return status.name();
}

এখানে, map() মেথড ব্যবহার করে Enum কে String তে ম্যাপ করা হচ্ছে।


৩. MapStruct দিয়ে Custom Enum Mapping

MapStruct এর সাহায্যে আপনি কাস্টম Enum Mapping করতে পারেন, যেখানে Enum এর মান পরিবর্তন করতে চাইলে আপনি @ValueMapping অ্যানোটেশন ব্যবহার করতে পারেন।

৩.১ Custom Enum Mapping Example

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ValueMapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    @Mapping(source = "status", target = "status")
    UserDTO userToUserDTO(User user);

    @ValueMapping(source = "ACTIVE", target = "A")
    @ValueMapping(source = "INACTIVE", target = "I")
    @ValueMapping(source = "PENDING", target = "P")
    String map(Status status);
}

এখানে, @ValueMapping অ্যানোটেশন ব্যবহার করে Enum এর বিভিন্ন মানের সাথে কাস্টম স্ট্রিং মান ম্যাপ করা হয়েছে।


সারাংশ

MapStruct এর মাধ্যমে Enum Mapping খুবই সহজ এবং কার্যকরী। এটি আপনাকে Enum এবং String এর মধ্যে ম্যাপিং করতে সহায়তা করে এবং আপনি কাস্টম ম্যাপিং লজিক প্রয়োগ করতে পারেন। MapStruct এর @Mapping এবং @ValueMapping অ্যানোটেশন ব্যবহার করে Enum এর মানকে String বা অন্য কোনো টাইপে ম্যাপ করা যেতে পারে, যা ডেটা ট্রান্সফারের জন্য অত্যন্ত গুরুত্বপূর্ণ। String থেকে Enum এবং Enum থেকে String ম্যাপিং এর মাধ্যমে আপনি আপনার ডোমেইন অবজেক্টের ডেটা কনভার্সন আরো সহজ এবং সুষ্ঠু করতে পারেন।


Content added By
Promotion